/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agenda.controle;

import agenda.bean.Cidade;
import agenda.bean.Contato;
import agenda.bean.Tabela;
import agenda.bean.Telefone;
import agenda.dao.CidadeDAO;
import agenda.dao.Conexao;
import agenda.dao.ContatoDAO;
import agenda.dao.TelefoneDAO;
import agenda.tela.TelaPesquisa;
import java.util.List;

/**
 *
 * @author Antonio
 */
public class ControleAgenda {
    private CidadeDAO daoCidade;
    private ContatoDAO daoContato;
    private TelefoneDAO daoTelefone;

    public ControleAgenda() {
        daoCidade = new CidadeDAO();
        daoContato = new ContatoDAO();
        daoTelefone = new TelefoneDAO();
    }

    public Tabela pesquisar(String coluna, String texto) {
        return daoContato.pesquisar(coluna, texto);
    }

    public boolean excluir(Integer id) {
        List<Telefone> telefones = daoTelefone.select("contato = " + id);
        for (Telefone t : telefones) {
            if (daoTelefone.delete(t.getId())) {
                // ok excluiu
            } else {
                // deu erro.
                Conexao.rollback();
                return false;
            }
        }
        daoContato.delete(id);
        return Conexao.commit();
    }

    public Contato carregaContato(Integer id) {
        List<Contato> contatos = daoContato.select("id = " + id);
        if (contatos.isEmpty()) {
            return new Contato();
        } else {
            return carregaTelefones(contatos.get(0));
        }
    }

    public Contato carregaTelefones(Contato c) {
        List<Telefone> telefones = daoTelefone.select("contato = " + c.getId());
        for (Telefone t : telefones) {
            c.addTelefone(t);
        }
        return c;
    }

    public List<Cidade> carregaCidades(String filtro) {
        return daoCidade.select(filtro);
    }

    public boolean gravar(Contato c, List<Telefone> telefonesExcluidos) {
        for (Telefone telefone : telefonesExcluidos) {
            if (!daoTelefone.delete(telefone.getId())) {
                Conexao.rollback();
                return false;
            }
        }
        
        if (c.getId() == null || c.getId() == 0) {
            daoContato.insert(c);
        } else {
            daoContato.update(c);
        }
        for (Telefone telefone : c.getTelefones()) {
            if (telefone.getId() == null || telefone.getId() == 0) {
                daoTelefone.insert(telefone);
            } else {
                daoTelefone.update(telefone);
            }
        }
        return Conexao.commit();
    }

    public Cidade pesquisaCidade() {
        TelaPesquisa tp = new TelaPesquisa(null, true, daoCidade.getSqlPesquisa());
        tp.setVisible(true);
        // quando a tela fechar volta.
        Integer id = tp.getIdSelecionado();
        tp.dispose();
        List<Cidade> cidades = daoCidade.select("id = " + id);
        if (cidades.isEmpty()) {
            return new Cidade();
        } else {
            return cidades.get(0);
        }
    }


}
